C++有一些在编译时计算的方法。模板添加了更多编译时计算的方法，而语言的发展也对此进行了增强。

并且可以决定是否使用某些模板代码，或者在不同的模板代码之间进行选择。但若所有必要的输入都可用，编译器可以在编译时计算控制流的结果。

事实上，C++可以通过多种特性来支持编译时编程:

\begin{itemize}
\item 
C++98前，模板提供了编译时计算的能力，包括使用循环和执行路径选择(因为使用了非直观的语法，所以有些人认为这是对模板特性的“滥用”)。

\item 
使用偏特化，可以在编译时根据约束或要求在不同的类模板实现之间进行选择。

\item 
使用SFINAE，可以针对类型或约束在函数模板实现之间进行选择。

\item 
C++11和C++14中，通过使用“直观的”执行路径选择，以及自C++14后的大多数语句类型(包括for循环、switch语句等)的constexpr特性，编译时计算得到了更好的支持。

\item 
C++17引入了“编译时if”解除依赖于编译时条件或约束的语句，其甚至可以在模板外工作。
\end{itemize}

本章将介绍这些特性，特别关注模板的角色和上下文。


